/*
*	Projeto de CG - DEFINIR TEMA
*	Created by Julio Cezar Novais Raffaine
*
*
*/
#ifndef _GAME_PROJECT__H
#define _GAME_PROJECT__H

//Base Includes
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <math.h>

//OpenGL e Glut includes
#include <GL/glut.h>
//#include <glui.h>

//Game Includes
#include "GameScene.h"
#include "Carinha.h"
#include "Comida.h"
#include "SceneNode.h"
#include "time.h"

//Frame Rate desejada no jogo
#define FRAME_RATE 30

namespace gameCG {
	//Tempo em segundos entre um frame e outro
	const int frame_time = 1000/FRAME_RATE;	
	
	//Estrutura utilizada para armazenar uma posição no espaço
	typedef struct{
		float x;
		float y;
		float z;
	} Position;

	//Estrutura que armazena uma rotação do objeto no eixo x e outra no eixo y
	typedef struct{
		float rx;
		float ry;
	} Rotation;

	//Classe principal do jogo, encapsula as funções da GLUT
	class GameProject {
		public:
			//Retorna nosso singleton, se o mesmo não foi instanciado, instancia um.
			static GameProject* getInstance(int argc, char** argv, bool bLog);

			//Destrutor
			~GameProject();
			//Inicia nosso jogo
			void start();

			//GLUT Callback functions, existe a necessidade de ser estáticas para compatibilidade C, C++
			static void render(void);
			static void reshape(GLsizei w, GLsizei h);
			static void keyboard(unsigned char key, int x, int y);
			static void speckeys(int key, int x, int y);
			static void mouse(int button, int state, int x, int y);
			static void timer(int v);

		private:
			GLfloat aRatio;			//A razão entre a largura e a altura da tela (aspect ratio)
			GLfloat viewAngle;  	//Angulo de visão do observador
			bool	windowed;		//O jogo está em uma janela ou em fullscreen
			int 	m_width;		//Largura da janela
			int 	m_height;		//Altura da janela
			FILE*   m_Log;			//Ponteiro para o arquivo de Log
			Position ObserverPos;	//Posição da camera
			Rotation ObserverRot;	//Posicao Angular da camera
			unsigned int m_lightFlags; 

			GameScene* 	Cena;		//Objeto que representa a cena que será exibida
			Carinha*  player; 		//Minhoquinha
			Comida* food;			//Comidinha

			void RotacaoMaluca();
			
			//Singleton - Usado para manter apenas uma instancia do aplicativo rodando por vez
			static GameProject* Instance;
			GameProject(int argc, char** argv, bool bLog);

			//Funçoes de Inicialização do OpenGL
			void setViewParameters();	//Configura uma matriz de projeção perspectiva
			void setObserver();			//Posiciona a camera
			void setLights();			//Posiciona e configura as luzes
			void initGL();				//Configura o OpenGL

			//Funçoes extras para escrever mensagens na tela
			void setOrthographicView();		//Configura uma matriz de projeção ortogonal
			void resetPerspectiveView();	//Retorna a matriz anterior
			//Escreve uma string na posicao x,y da tela, com a fonte desejada
			void renderBitmapString(float x, float y, void *font,char *string);

			//Escreve no arquivo de Log
			void Log(char *, ...);

			//Desaloca todos os recursos alocados e sai
			void Release();
	};
}
#endif 
